package com.b2b.utils;

import com.b2b.utils.Tools;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 版权：上海极和信息科技有限公司
 * 功能：中文转拼音
 * 作者：朱伟峰
 * 邮箱：zhuweifeng24@gmail.com
 * 日期：2017年4月8日
 */
public class PinyinTool
{
	public static void main(String[] args)
	{
		String str = "基安圣";
		PinyinTool t = new PinyinTool();
		String a = t.firstUpperToPinYin(str);
		System.err.println(a);
		
	}
	
	HanyuPinyinOutputFormat format = null;

	public static enum Type
	{
		UPPERCASE, // 全部大写
		LOWERCASE, // 全部小写
		FIRSTUPPER // 首字母大写
	}

	public PinyinTool()
	{
		format = new HanyuPinyinOutputFormat();
		format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
	}

	public String firstUpperToPinYin(String str)
	{
		String firstStr = "#";
		if (Tools.isTrimEmpty(str))
			return firstStr;
		
		try
		{
			String pinyin = toPinYin(str, "", Type.FIRSTUPPER);
			if (Tools.isTrimEmpty(pinyin))
				return firstStr;
			firstStr = pinyin.substring(0, 1);
		}
		catch (BadHanyuPinyinOutputFormatCombination e)
		{
			return firstStr;
		}
		return firstStr;
	}
	
	public String toPinYin(String str) throws BadHanyuPinyinOutputFormatCombination
	{
		return toPinYin(str, "", Type.UPPERCASE);
	}

	public String toPinYin(String str, String spera) throws BadHanyuPinyinOutputFormatCombination
	{
		return toPinYin(str, spera, Type.UPPERCASE);
	}

	/**
	 * 将str转换成拼音，如果不是汉字或者没有对应的拼音，则不作转换
	 * 如： 明天 转换成 MINGTIAN
	 * @param str
	 * @param spera
	 * @return
	 * @throws BadHanyuPinyinOutputFormatCombination
	 */
	public String toPinYin(String str, String spera, Type type) throws BadHanyuPinyinOutputFormatCombination
	{
		if (str == null || str.trim().length() == 0)
			return "";
		if (type == Type.UPPERCASE)
			format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
		else
			format.setCaseType(HanyuPinyinCaseType.LOWERCASE);

		String py = "";
		String temp = "";
		String[] t;
		for (int i = 0; i < str.length(); i++)
		{
			char c = str.charAt(i);
			if ((int) c <= 128)
				py += c;
			else
			{
				t = PinyinHelper.toHanyuPinyinStringArray(c, format);
				if (t == null)
					py += c;
				else
				{
					temp = t[0];
					if (type == Type.FIRSTUPPER)
						temp = t[0].toUpperCase().charAt(0) + temp.substring(1);
					py += temp + (i == str.length() - 1 ? "" : spera);
				}
			}
		}
		return py.trim();
	}
}